/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Interface;

import java.awt.BorderLayout;
import java.awt.CheckboxMenuItem;
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.Timer;

/**
 * Fenêtre contenant le jeu, le menu et l'interface sur le côté.
 * @author Laurent/Pascal
 */
public class Fenetre extends JFrame {

    Jeu jeu = new Jeu();
    JPanel pnlCote = new JPanel(new BorderLayout());
    JPanel pnlStats = new JPanel(new GridLayout(5, 1));
    JLabel lblPointage = new JLabel("", JLabel.LEFT);
    JLabel lblKills = new JLabel("", JLabel.LEFT);
    JLabel lblAssistants = new JLabel("", JLabel.LEFT);
    JLabel lblPowerUpsUtilises = new JLabel("", JLabel.LEFT);
    JPanel pnlCoteInferieur = new JPanel(new GridLayout(3, 1));
    JLabel lblDifficulte = new JLabel("", JLabel.CENTER);
    JLabel lblPowerUp = new JLabel("Power up en attente:", JLabel.CENTER);
    JLabel lblAchievement = new JLabel("Dernier trophée obtenu:", JLabel.CENTER);
    JPanel pnlBoutons = new JPanel(new GridLayout(2, 1));
    JButton btnQuitter = new JButton("Quitter");
    JButton btnPause = new JButton("Pause");
    MenuBar menuBar = new MenuBar();
    Menu mnuFichier = new Menu("Fichier");
    Menu mnuOptions = new Menu("?");
    MenuItem mfPartie = new MenuItem("Nouvelle partie");
    Menu mfPrototype = new Menu("Mode prototype ");
    MenuItem mfBarre = new MenuItem("----------------------------------");
    MenuItem mfBarre2 = new MenuItem("----------------------------------");
    MenuItem mfBarre3 = new MenuItem("----------------------------------");
    MenuItem mfQuitter = new MenuItem("Quitter");
    MenuItem mfAide = new MenuItem("Aide...");
    MenuItem mfScores = new MenuItem("Tableau de pointage");
    MenuItem mfAchievements = new MenuItem("Trophées");
    MenuItem mfPropos = new MenuItem("À propos...");
    CheckboxMenuItem cbxPrototype = new CheckboxMenuItem("Mode prototype");
    int compteurTimer = 10;
    boolean enModeGore = false;
    Thread threadFenetre = new Thread() {

        /**
         * Va chercher en temps réel les informations pour le pointage, le
         * power-up en attente et le dernier trophée obtenu.
         */
        @Override
        public void run() {

            while (true) {
                if (getNomPowerUp().equals("MODE GORE") && !enModeGore) {
                    tmrAcceleration.start();
                } else if (!enModeGore) {
                    lblDifficulte.setText(jeu.getNiveauDiff());
                    if (jeu.getCompteurDif() < 60) {
                        lblDifficulte.setForeground(Color.green);
                        lblDifficulte.setBackground(Color.black);
                    } else if (jeu.getCompteurDif() < 120) {
                        lblDifficulte.setForeground(Color.yellow);
                        lblDifficulte.setBackground(Color.BLACK);
                    } else if (jeu.getCompteurDif() < 180) {
                        lblDifficulte.setForeground(Color.red);
                        lblDifficulte.setBackground(Color.YELLOW);
                    }
                }
                lblDifficulte.revalidate();

                lblPowerUp.setText("Power up: " + getNomPowerUp());
                lblPointage.setText("Points: " + getPoints());
                int kills =Monde.killCount+Monde.killMineurs-1;
                lblKills.setText("Kills: "+kills);
                lblAssistants.setText("Assistants: "+Monde.tourelles.size());
                lblPowerUpsUtilises.setText("Power Ups utilisés: "+Monde.powerUpsUtilise);

                lblAchievement.setText("Dernier trophée obtenu: " + dernierAchievement());

                repaint();
                try {
                    Thread.sleep(25);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                    System.exit(1);
                }


            }
        }
    };
    Timer tmrAcceleration = new Timer(1000, new ActionListener() {

        /**
         * Affiche le temps restant à l'augmentation de la difficulté dans le paneau 
         * à la droite de la fenêtre quand ce power-up est activé.
         */
        @Override
        public void actionPerformed(ActionEvent e) {

            lblDifficulte.setBackground(Color.yellow);
            lblDifficulte.setText("HARDCORE " + compteurTimer);
            lblDifficulte.setForeground(Color.red);
            lblDifficulte.revalidate();
            enModeGore = true;

            if (compteurTimer == 0) {
                enModeGore = false;
                tmrAcceleration.stop();
                compteurTimer =5;

            }
            
            compteurTimer--;

        }
    });

    /**
     * Constructeur de la fenêtre. Ajoute les composantes et le menu.
     */
    public Fenetre() {

        lblDifficulte.setFont(new Font("Arial", Font.BOLD, 20));
        lblPowerUp.setFont(new Font("Arial", Font.BOLD, 14));
        pnlCote.setPreferredSize(new Dimension(250, jeu.getHeight()));



        btnQuitter.addActionListener(new ActionListener() {

            /**
             * Demande au joueur s'il veut quitter le jeu. Si oui, ferme la fenêtre.
             */
            @Override
            public void actionPerformed(ActionEvent e) {
                jeu.pauseJeu();
                if (JOptionPane.showConfirmDialog(jeu, " Voulez-vous vraiment quitter le jeu?", "Quitter", JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION) {
                    System.exit(0);

                } else {
                    jeu.pauseJeu();
                }
            }
        });

        /**
         * Met le jeu à pause: suspend le thread du jeu.
         */
        btnPause.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                pauseJeu();
                jeu.pauseSouris();
            }
        });
        lblDifficulte.setOpaque(true);
        pnlCoteInferieur.add(lblDifficulte);
        lblPowerUp.setOpaque(true);
        lblPowerUp.setBackground(Color.BLACK);
        lblPowerUp.setForeground(Color.white);
        pnlCoteInferieur.add(lblPowerUp);
        lblAchievement.setOpaque(true);
        lblAchievement.setBackground(Color.BLACK);
        lblAchievement.setForeground(Color.white);
        

        pnlCoteInferieur.add(lblAchievement);

        pnlBoutons.add(btnPause);
        btnPause.setOpaque(true);
        btnPause.setBackground(Color.white);        
        pnlBoutons.add(btnQuitter);
        btnQuitter.setOpaque(true);
        btnQuitter.setBackground(Color.white);



        pnlStats.add(lblPointage);
        lblPointage.setOpaque(true);
        lblPointage.setBackground(Color.black);
        lblPointage.setForeground(Color.white);
        pnlStats.add(lblKills);
        lblKills.setOpaque(true);
        pnlStats.add(lblAssistants);
        lblAssistants.setOpaque(true);
        lblAssistants.setBackground(Color.black);
        lblAssistants.setForeground(Color.white);
        pnlStats.add(lblPowerUpsUtilises);
        lblPowerUpsUtilises.setOpaque(true);

        pnlCote.add(pnlStats, BorderLayout.NORTH);
        pnlCote.add(pnlCoteInferieur, BorderLayout.CENTER);
        pnlCote.add(pnlBoutons, BorderLayout.SOUTH);
        ajouterListeners();

        mfPrototype.add(cbxPrototype);

        mnuFichier.add(mfPartie);
        mnuFichier.add(mfPrototype);
        mnuFichier.add(mfBarre);
        mnuFichier.add(mfQuitter);

        mnuOptions.add(mfAide);
        mnuOptions.add(mfBarre2);
        mnuOptions.add(mfScores);
        mnuOptions.add(mfAchievements);
        mnuOptions.add(mfBarre3);
        mnuOptions.add(mfPropos);

        menuBar.add(mnuFichier);
        menuBar.add(mnuOptions);

        this.setMenuBar(menuBar);



        this.setLayout(new BorderLayout());
        this.add(jeu, BorderLayout.CENTER);
        this.add(pnlCote, BorderLayout.EAST);
        this.setSize(1274, 788);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);

        threadFenetre.start();
    }

    /**
     * Va chercher le pointage de la partie en cours.
     * @return pointage
     */
    public int getPoints() {
        return jeu.getPoints();
    }

    /**
     * Va chercher le nom du power-up en attente.
     * @return type du power up.
     */
    public String getNomPowerUp() {
        return jeu.getNomPowerUp();
    }

    /*
     * Met le jeu à pause.
     */
    public void pauseJeu() {
        jeu.pauseJeu();
    }

    /*
     * Pour alléger le constructeur. Ajoute les listeners aux éléments du menu.
     */
    private void ajouterListeners() {

        mfQuitter.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                jeu.pauseJeu();
                if (JOptionPane.showConfirmDialog(jeu, " Voulez-vous vraiment quitter le jeu?", "Quitter", JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION) {
                    System.exit(0);

                } else {
                    jeu.pauseJeu();
                }

            }
        });


        mfPartie.addActionListener(new ActionListener() {

            /**
             * Demande au joueur s'il veut quitter le jeu. Si oui, ferme la fenêtre.
             */
            @Override
            public void actionPerformed(ActionEvent e) {
                if (!jeu.isPaused) {
                    jeu.pauseJeu();
                }
                int choix = JOptionPane.showConfirmDialog(jeu, " Voulez-vous vraiment commencer une nouvelle partie?", "Nouvelle partie", JOptionPane.OK_CANCEL_OPTION);

                if (choix == JOptionPane.OK_OPTION) {

                    jeu.resetMonde();
                    jeu.pauseJeu();

                } else {
                    jeu.pauseJeu();
                }
            }
        });

        /**
         * Affiche l'histoire et les règles du jeu dans un JOptionPane.
         */
        mfAide.addActionListener(new ActionListener() {

            String regles = "Bienvenu dans le futur! Nous sommes le 23 décembre 2012.\n\nComme l'avaient prédit les Mayas, l'humanité a pu assister à la fin du monde tel qu'il le connaissait. Effectivement, la troisième dimension de notre univers s'est affaissée, nous emprisonnant tous dans un seul plan.\n"
                    + "Prévoyant la catastrophe, les gouvernements ont développé et affiné de nouvelles technologies, entre autres dans les domaines de l'aérospatial et de la génétique.\n"
                    + "Un scientifique fou se faisant appeler «Dan» a profité de ce boom technologique pour tenter de s'approprier la Terre. \n"
                    + "Pour ce faire, il a cloné des millions de fois un jeune homme insoupçonnant du nom de David et a créé une armée, qu'il a mis au commandes d'une flotte de vaisseaux spatiaux 2D.\n"
                    + "Cependant, il a fait quelques erreurs dans ses formules,ce qui a engendré quelques problèmes: la plupart de ses clones sont dépourvus de corps, ils n'ont que la tête et ils sont devenus complètement blancs.\n"
                    + "Il a donc jeté ces millions de têtes hirsutes sur la terre et il revient à l'assaut de la planète avec sa nouvelle armée améliorée.\n"
                    + "Vous êtes un des défenseurs de la planète Terre, dont l'armée s'est saisie des millions de têtes de clones abandonnées et s'en servent comme projectiles, exploitant les propriétés contondantes de leurs chevelures hirsutes.\n"
                    + "\nRègles:\n\n"
                    + "Vous occupez une tourelle volée au machiavélique «Dan» et vous devez neutraliser le plus de vaisseaux ennemis possible avant qu'ils n'aient pu larguer assez d'examens de maths (4) pour vous tuer.\n"
                    + "Pour détruire les vaisseaux ou les devoirs, vous devez leurs lancer des têtes de David.\n"
                    + "Les obus INTRA-FINAL largués par les super-vaisseaux vous tuerons d'un seul coup.";

            @Override
            public void actionPerformed(ActionEvent e) {

                jeu.pauseJeu();
                JOptionPane.showMessageDialog(jeu, regles, "Règles du jeu", JOptionPane.INFORMATION_MESSAGE);
                jeu.pauseJeu();
            }
        });

        /**
         * Affiche les noms des auteurs et la date de remise du jeu dans un JOptionPane.
         */
        mfPropos.addActionListener(new ActionListener() {

            String propos = "Jeu réalisé par: Laurent Mandrile et Pascal Rivard\n"
                    + "Date de création: 10 décembre 2011";

            @Override
            public void actionPerformed(ActionEvent e) {

                jeu.pauseJeu();
                JOptionPane.showMessageDialog(jeu, propos, "À propos", JOptionPane.INFORMATION_MESSAGE);
                jeu.pauseJeu();
            }
        });

        /**
         * Active le mode prototype.
         */
        cbxPrototype.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                jeu.modePrototype();
            }
        });

        /**
         * Affiche le tableau des pointages dans un JOptionPane.
         */
        mfScores.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                jeu.afficherScores();
            }
        });

        /**
         * Affiche les trophées dans un JOptionPane.
         */
        mfAchievements.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                jeu.afficherAchievements();
            }
        });


    }

    /**
     * Va chercher le nom du dernier trophée obtenu;
     * @return nom du dernier trophée obtenu.
     */
    public String dernierAchievement() {
        return jeu.dernierAchievement();
    }
}
